package com.zql.LeetCode;

/**
 * Created By ShuHua on 2021/9/28.
 */
public class MinEatingSpeed_875 {
    public static int minEatingSpeed(int[] piles, int H){
        int max = getMax(piles);
        int left = 1; //注意这里的取值不能为0 ，如果为0的话会报/ byZeroException 因为mid有可能等于0作为除数传进eatSpeed函数中
        int right = max;
        //left和right的取值范围:[0,max(piles)] left取最小，right取最大；
        while (left<right){
            int mid = left+(right-left)/2;
            int result = eatSpeed(piles,mid);
            if(result==H){
                right=mid;
                //接下来的大于H和小于H怎么操作 就看result的那个函数是单调递增还是递减 递增就跟之前的二分求左右区间一样操作，递减就反着来操作，想象一下递减函数的图像
            }else if(result<H){
                right=mid;
            }else if(result>H){
                left=mid+1;
            }
        }

        return left;

    }

    /**
     * 求出 每小时吃k根香蕉 吃完这一堆需要花费多少个小时
     * @param piles 香蕉堆数组
     * @param k 每小时吃多少根香蕉
     * @return
     *
     * 建立函数关系是注意，一堆中剩下没吃完的还算一堆，而不是和下一堆拼成新的一堆
     */
    public static int eatSpeed(int[] piles,int k){
        int hours=0;
        for(int i=0;i<piles.length;i++){
            int nowNum = piles[i];
            hours+= nowNum/k;
            if(nowNum%k>0) hours++;
        }
        return hours;
    }
    public static int getMax(int[] nums){
        int max = nums[0];
        for(int i=1;i<nums.length;i++){
            if(nums[i]>max)max=nums[i];
        }

        return max;
    }


    public static void main(String[] args) {
        int[] nums = {30,11,23,4,20};
        int h = eatSpeed(nums,30);
        System.out.println(h);
        int min = minEatingSpeed(nums,5);
        System.out.println(min);
    }
}
